//题目:
// 给你一个整数 n ，请你找出并返回第 n 个 丑数 。
// 丑数 就是质因子只包含 2、3 和 5 的正整数。

// 示例 1：
// 输入：n = 10
// 输出：12
// 解释：[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

// 示例 2：
// 输入：n = 1
// 输出：1
// 解释：1 通常被视为丑数。
 
// 提示：
// 1 <= n <= 1690
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
//代码
class Solution 
{
    vector<int> dp;
public:
    // int nthUglyNumber(int n) 
    // {
    //     //1.创建dp表————dp[i]表示：第i个丑数的值
    //     vector<long long> dp(n+1);
    //     //2.初始化
    //     dp[1]=1;
    //     //3.填表————状态转移方程：int min_val;for(int j=dp[i-1]/5;j<=dp[i-1];j++) if()
    //     for(int i=2;i<=n;i++)
    //     {
    //         long long min_val=LONG_MAX;
    //         for(int j=dp[1];j<n && 2*dp[j]<min_val;j++)
    //         {
    //             if(2*dp[j]>dp[i-1]) min_val=2*dp[j];
    //             if(3*dp[j]>dp[i-1] && 3*dp[j]<min_val) min_val=3*dp[j];
    //             if(5*dp[j]>dp[i-1] && 5*dp[j]<min_val) min_val=5*dp[j];
    //         }
    //         dp[i]=min_val;
    //     }
    //     //4.确定返回值
    //     return dp[n];
    // }
    int nthUglyNumber(int n) {
        vector<int> dp(n + 1);
        dp[1] = 1;
        int p2 = 1, p3 = 1, p5 = 1;
        for (int i = 2; i <= n; i++) {
            int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
            dp[i] = min(min(num2, num3), num5);
            if (dp[i] == num2) {
                p2++;
            }
            if (dp[i] == num3) {
                p3++;
            }
            if (dp[i] == num5) {
                p5++;
            }
        }
        return dp[n];
    }
};